package persistance.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import configur.PluginFactory;
import exception.DatabaseConnectionException;
import exception.PluginException;

/**
 * class ConnectionFactoryImpl.
 * 
 * @author Groupe03-2013
 * 
 */
public class ConnectionFactoryImpl implements ConnectionFactory {

	Connection connection = null;

	// bloc static d'initialisation
	{
		String driver = PluginFactory.INSTANCE.getProperty("conx.driver");
		String url = PluginFactory.INSTANCE.getProperty("conx.db.server");
		String pseudo = PluginFactory.INSTANCE.getProperty("conx.db.name");
		String mdp = PluginFactory.INSTANCE.getProperty("conx.db.password");
		try {
			Class.forName(driver);
			this.connection = DriverManager.getConnection(url, pseudo, mdp);
		} catch (SQLException e) {
			throw new DatabaseConnectionException(
					"[ERREUR][Connexion à la DB]\n\tImpossible de se connecter à la base de donnée; du soit à un mauvais serveur, nom ou mot de passe.");
		} catch (ClassNotFoundException e) {
			throw new PluginException(
					"[ERREUR][Connexion à la DB]\n\tImpossible de se connecter à la base de donnée; du au driver JDBC qui n'est pas installé.");
		}
	}

	/**
	 * Connexion à la base de données.
	 * 
	 * @return une connexion a la base de donnees
	 */
	public final Connection getConnection() {
		if (this.connection == null) {
			throw new DatabaseConnectionException(
					"[ERREUR][Connexion à la DB]\n\tIl est impossible pour le programme de recupérer la connexion à la base de données.");
		}
		return connection;
	}

	/**
	 * Ferme la connexion a la base de donnees
	 */
	public final void closeConnection() {
		if (this.connection == null) {
			return;
		}
		try {
			this.connection.close();
			this.connection = null;
		} catch (SQLException e) {
			throw new DatabaseConnectionException(
					"[ERREUR][Déconnexion à la DB]\n\tIl est impossible pour le programme de fermer la connexion à la base de données.");
		}
	}
}
